\chapter{Ingenier\'ia en software}
\section{Calidad de software}
\subsection{SVN}
Para comenzar a trabajar con la documentaci\'on y m\'as tarde con el c\'odigo optamos por un repositorio para el control de versiones. El repositorio elegido fue el que nos brinda Google: GoogleCode (\url{https://code.google.com}) para obtener un repositorio es necesario tener una cuenta en gmail.
Google Code es un servicio gratuito proporcionado por Google que permite de manera relativamente fácil 
tener un conjunto de servicios muy útiles para todo proyecto de desarrollo.

Incluye:
\begin{itemize}
	\item descargas
	\item wiki
	\item gestión de problemas (issues)
	\item fuentes con acceso a Subversion
\end{itemize}

Cuando creamos un nuevo proyecto, un formulario aparecerá en pantalla con los siguientes elementos:
\begin{itemize}
\item \textbf{Project Name:} Nombre del proyecto, debe de ser único por lo que si otra persona ya creó un proyecto con el mismo nombre en GoogleCode usted no podrá usarlo. Debe de estar en minúsculas y sin símbolos.
\item \textbf{Summary:} Resumen del proyecto, debe ser muy corto pero explícito.
\item \textbf{Description:} Descripción más detallada del proyecto.
\item \textbf{Licence:} Licencia del proyecto. Al ser accesible por cualquier persona, se proponen únicamente licencias Open Source.
\item \textbf{Labels:} Son palabras claves que permitirán a otras personas encontrar su proyecto.
\end{itemize}
Cuando hayamos completado las items anteriores podemos ver el home de nuestro proyecto como se muestra en la Figura ~\ref{fig:svnhome}.
En el sistema de control de versiones seleccionamos “Subversión”, y en la licencia del código fuente
GNU GPL v3. Luego creamos el proyecto \textit{profinsisdecomp} (Proyecto final de sistemas de computaci\'on). Una vez hecho el proyecto ya crea la estructura inicial y podemos tener una copia local por medio de la siguiente l\'inea:

\begin{listing}[style=consola, numbers=none]
svn checkout https://profinsisdecom.googlecode.com/svn/trunk/ profinsisdecom --username nuestromail@gmail.com
\end{listing}

Con este repositorio nos ahorramos el trabajo de estar preocup\'andonos por guardar carpetas locales con cada cambio que realizamos en la documentaci\'on \'o en el c\'odigo. Simplemente ejecutamos \textit{svn commit} para subir los cambios al repositorio y \textit{svn update} para bajar la \'ultima versi\'on, permiti\'endonos la posibilidad de obtener una versi\'on anterior del proyecto as\'i como tambi\'en comparar distintas versiones. Con esta herramienta nos aseguramos de no perder ning\'un cambio y tener todo respaldado ante una eventual p\'erdida de informaci\'on local adem\'as de tener un seguimiento m\'as detallado del proyecto.

\begin{figure}[H]
		\centering
		\includegraphics[scale=0.3]{capitulo02/svnhome}
		\caption{Home del proyecto}
		\label{fig:svnhome}
\end{figure}

\section{UML}
Una primera aproximaci\'on a la implementaci\'on del sistema es verlo atrav\'es de los casos de uso usando UML, a partir de este vamos a obtener los escenarios que se nos presentar\'an en el proyecto y desde ese punto generar el LEL (l\'exico de lenguaje extendido) que nos permite obtener las clases candidatas para generar diagramas de objetos de la realidad, ser\'ia una aproximaci\'on al diagrama de clases final.
\subsection{Casos de uso}

\begin{figure}[H]
		\centering
		\includegraphics[scale=0.7]{capitulo02/casodeuso}
		\caption{Casos de uso}
		\label{fig:use_case}
	\end{figure}
	
Los casos de uso que mostramos en la figura ~\ref{fig:use_case} podemos ver al usuario que interact\'ua con el sistema en el lado izquierdo, y en el lado derecho el robot tambi\'en interact\'ua con este. El usuario puede iniciar el sistema, de manera tal de comenzar a jugar como se muestra en la figura \ref{fig:init}.

\begin{figure}[H]
		\centering
		\includegraphics[scale=0.7]{capitulo02/inicio}
		\caption{Inicio de la aplicaci\'on}
		\label{fig:init}
\end{figure}


Una vez que el sistema inicie y con la confirmaci\'on al usuario de que esta listo para recibir \'ordenes el usuario comienza el juego viendo en su pantalla y escogiendo entre avanzar \'o rotar y el robot recibe estas \'ordenes por parte del sistema ejecutandolas y devolviendole al sistema lo nuevo que descubri\'o de esta manera retroalimenta al usuario para que tome las nuevas decisiones. 

\subsection{Escenarios}
Un escenario en UML es una circustancia o situación, en la que se puede encontrar un sistema. Esto quiere decir que, el conjunto de escenarios, definien el sistema, o al menos, lo que puede hacer el sistema. De lo que deducimos, que los escenarios nos sirven para definir, que hace y que no hace un sistema.
Un escenario, en si mismo puede dividirse, en acciones, estas acciones, definen que caminos puede tomar un escenario. Los escenarios son condicionales, eso quiere decir que pueden tener diferentes salidas o resultados, conectar un joystick, puede acabar correctaemente con el joystick conectado, o incorrectamente, porque justamente el joystick no est\'a disponible \'o est\'a mal conectado.

Los escenarios que se nos presentaron en nuestro proyecto son los que se detallan en las tablas siguientes:
%----------------------------------------------------------------------------
% Comienzo de las tablas de escenarios
%----------------------------------------------------------------------------
\bigskip
\begin{table}[H]
\centering
%\resizebox{12cm}{!} {
\begin{tabular}{ |>{\columncolor[gray]{0.9}} l | l |}
	\hline
	\textit{\textbf{T\'itulo}}	&Iniciar comunicaci\'on con lego \\ 
	\hline
	\textit{\textbf{Objetivos}}	&Lograr que el sistema pueda utilizar el LEGO\\ 
	\hline
	\textit{\textbf{Contexto}}	&Robot encendido, Sistema levantado\\ 
	\hline
	\textit{\textbf{Recursos}}	&Robot, Joystick, Sistema \\ 
	\hline
	\textit{\textbf{Actores}}	&Usuario, con2Ini (Controlador conexi\'on inicial)\\ 
	\hline
	\textit{\textbf{Episodios}}	&Usuario da orden al con2Ini para que conecte \\
								&con LEGO con2Ini emite orden de conexi\'on \\
								&a SMR (signal manager robot)\\	
	\hline
\end{tabular}
%}
\caption{Inicio comunicaci\'on}
\label{fig:con2ini_esc}
\end{table}
%----------------------------------------------------------------------------
\bigskip
\begin{table}[H]
\centering
\begin{tabular}{|>{\columncolor[gray]{0.9}} l | l |}
\hline
\textit{\textbf{T\'itulo}}  & Signal manager robot (SMR)\\ 
\hline
\textit{\textbf{Objetivo}}  & Enviar comandos a robot y recibir estados\\ 
\hline
\textit{\textbf{Contexto}}  & Conexión establecida\\ 
\hline
\textit{\textbf{Recursos}}  & Sistema, Robot\\
\hline
\textit{\textbf{Actores}}   & con2Ini, SMR,SMJ\\ 
\hline
\textit{\textbf{Episodios}} & SMR recibe orden de conexi\'on de con2ini\\
		  & SMR env\'ia orden a robot\\
		  & SMR recibe información de estado de robot\\
		  & SMR env\'ia comando de chequear distancia pared\\
		  & SMR recibe informaci\'on de distancia a puntos cardinales\\
		  & SMR envía informaci\'on de distancia a puntos cardinales\\
		  & a CA (construcci\'on ambiental)\\
		  & SMR recibe instrucci\'on de SMJ\\ \hline
\end{tabular}
\caption{Signal Manager Robot}
\label{fig:SMR_esc}
\end{table}
%----------------------------------------------------------------------------
\bigskip
\begin{table}[H]
\centering
\begin{tabular}{|>{\columncolor[gray]{0.9}} l | l |}
	\hline
   	\textit{\textbf{T\'itulo}}    & Construir ambiente\\
   	\hline
	\textit{\textbf{Objetivo}}  & Generar mapa del entorno del robot\\ 
	\hline
	\textit{\textbf{Contexto}}  & Informaci\'on recibida de Robot\\ 
	\hline
	\textit{\textbf{Recursos}}  & Informaci\'on\\ 
	\hline
	\textit{\textbf{Actores}}   & CA (construcci\'on ambiental), SMR\\ 
	\hline
	\textit{\textbf{Episodios}} & CA recibe informaci\'on de SMR\\
		  	  & CA decodifica informaci\'on de SMR\\
		  	  & CA construye mapa de entorno\\
		  	  & CA env\'ia mapa a viewManager\\
	\hline
\end{tabular}
\caption{Construir ambiente}
\label{fig:CA_esc}
\end{table}
%---------------------------------------------------------------------------- 
\bigskip
\begin{table}[H]
\centering
\begin{tabular}{|>{\columncolor[gray]{0.9}} l | l |}
	\hline
   	\textit{\textbf{T\'itulo}} 	  & Mostrar informaci\'on de estado y topolog\'ia\\
   	\hline
   	\textit{\textbf{Objetivo}}  & Actualizar pantalla\\ 
   	\hline
	\textit{\textbf{Contexto}}  & Mapa recibido de CA\\ 
	\hline
	\textit{\textbf{Recursos}}  & Mapa, Pantalla\\ 
	\hline
	\textit{\textbf{Actores}}   & CA, viewManager\\ 
	\hline
	\textit{\textbf{Episodios}} & viewManager recibe informaci\'on\\
			  & viewManager decodifica informaci\'on\\
			  & viewManager actualiza pantalla\\ 
	\hline
\end{tabular}
\caption{Estado y topolog\'ia}
\label{fig:VM_esc}
\end{table}
%----------------------------------------------------------------------   
\bigskip
\begin{table}[H]
\centering
\begin{tabular}{|>{\columncolor[gray]{0.9}} l | l |}
   	\hline
   	\textit{\textbf{T\'itulo}}  & Avanzar\\ 
   	\hline   	
	\textit{\textbf{Objetivo}}  & Trasladar robot un casillero en la pantalla\\ 
	\hline
	\textit{\textbf{Contexto}}  & Robot encendido, Sistema levantado\\ 
	\hline
	\textit{\textbf{Recursos}}  & Robot, Joystick, Sistema\\ 
	\hline
	\textit{\textbf{Actores}}   & Usuario, SMJ (signal manager joystick)\\ 
	\hline
	\textit{\textbf{Episodios}} & Usuario env\'ia comando avanzar\\
			  & SMJ decodifica instrucci\'on\\
			  & SMJ envia instrucci\'on a SMR\\ 
	\hline
\end{tabular}
\caption{Avanzar}
\label{fig:avanzar}
\end{table}
%----------------------------------------------------------------------------
\bigskip
\begin{table}[H]
\centering
\begin{tabular}{|>{\columncolor[gray]{0.9}} l | l |}
	\hline
   	\textit{\textbf{T\'itulo	}}  & Girar 90 grados a la izquierda\\
   	\hline
	\textit{\textbf{Objetivo}}  & Robot cambie su direcci\'on girando sobre su eje a la izquierda\\ 
	\hline
	\textit{\textbf{Contexto}}  & Robot encendido, Sistema levantado\\ 
	\hline
	\textit{\textbf{Recursos}}  & Robot, Joystick, Sistema\\ 
	\hline
	\textit{\textbf{Actores}}   & Usuario, SMJ (signal manager joystick)\\ 
	\hline
	\textit{\textbf{Episodios}} & Usuario env\'ia comando girar\\
			  & SMJ decodifica instrucci\'on\\
			  & SMJ envia instrucci\'on a SMR\\ 
	\hline
\end{tabular}
\caption{Rotar}
\label{fig:rotar}
\end{table}
%----------------------------------------------------------------------------
% Fin de tablas de escenarios
%----------------------------------------------------------------------------

\subsection{LEL}
El léxico extendido del lenguaje (LEL) es una técnica para obtener los requierimientos. Este tipo de metodología, la utilizan los ingenieros en software, para poder adquirir conocimientos del dominio sobre cual están trabajando y poder ordenar esa información de alguna manera.
De acuerdo con los escenarios obtuvimos los siguientes resultados para nuestro LEL de esta manera nos estamos acercando a los diagramas que nos permitiran escribir el c\'odigo para nuestro proyecto.

%----------------------------------------------------------------------------
% Comienzo de las tablas LEL
%----------------------------------------------------------------------------
\bigskip
\begin{table}[H]
\centering
\begin{tabular}{|>{\columncolor[gray]{0.9}} l | l |}
	\hline
	\textit{\textbf{Sin\'onimo}}	& Usuario\\ 
	\hline
	\textit{\textbf{Noci\'on}}	& Persona con intenciones de jugar\\ 
	\hline
	\textit{\textbf{Impacto}}	& Env\'ia comandos a SMJ\\
								& Inicia con2Ini\\ 
	\hline
\end{tabular}
\caption{Usuario}
\label{fig:user}
\end{table}
%----------------------------------------------------------------------------

\bigskip
\begin{table}[H]
\centering
\begin{tabular}{|>{\columncolor[gray]{0.9}} l | l |}
	\hline
	\textit{\textbf{Sin\'onimo}}		& Robot\\
	\hline
	\textit{\textbf{Noci\'on}}		& Robot que puede avanzar, girar y puede reconocer su alrededor\\
	\hline
	\textit{\textbf{Impacto}}		& Env\'ia informaci\'on a SMR\\
	\hline
									& Recibe comandos de avanzar de SMR\\
									& Recibe comandos de girar 90 grados a su izquierda de SMR\\
									& Recibe comandos de girar 90 grados a su derecha de SMR\\
	\hline
\end{tabular}
\caption{Robot}
\label{fig:robot}
\end{table}

\bigskip
\begin{table}[H]
\centering
\begin{tabular}{|>{\columncolor[gray]{0.9}} l | l |}
	\hline
	\textit{\textbf{Sin\'onimo}}	& con2Ini\\
	\hline
	\textit{\textbf{Noci\'on}}	& Entidad que inicia la comunicación entre sistema y robot\\
	\hline
	\textit{\textbf{Impacto}}	& Recibe informaci\'on de conexi\'on de usuario\\
	\hline
								& Emite orden de conexi\'on a SMR (signal manager robot)\\
	\hline
\end{tabular}
\caption{con2Ini}
\label{fig:con}
\end{table}
	
\bigskip
\begin{table}[H]
\centering
\begin{tabular}{|>{\columncolor[gray]{0.9}} l | l |}
	\hline
	\textit{\textbf{Sin\'onimo}}	& SMR\\
	\hline
	\textit{\textbf{Noci\'on}}  	& Entidad encargada de enviar comandos y recibir informaci\'on del Robot\\ 	\hline
	\textit{\textbf{Impacto}}  	& Recibe orden de conexi\'on de con2ini\\
								& Env\'ia orden a Robot\\
						 		& Recibe informaci\'on de estado de Robot\\
								& Envía informaci\'on de distancia a puntos cardinales a CA (construcción\\
								& ambiental)\\
								& Recibe instrucci\'on de avanzar de SMJ\\
								& Recibe instrucci\'on de girar 90 grados a su izquierda de SMJ\\
								& Recibe instrucci\'on de girar 90 grados a su derecha de SMJ\\
	\hline
\end{tabular}
\caption{signal Manager Robot}
\label{fig:SMR_lel}
\end{table}
	
\bigskip
\begin{table}[H]
\centering
\begin{tabular}{|>{\columncolor[gray]{0.9}} l | l |}
	\hline
	\textit{\textbf{Sin\'onimo}}	& SMJ\\
	\hline
	\textit{\textbf{Noci\'on}}  	& Decodifica comandos del usuario y env\'ia a SMR\\
	\hline
	\textit{\textbf{Impacto}}	& SMJ envia instrucci\'on decodificada a SMR\\
	\hline
\end{tabular}
\caption{Signal Manager Joystick}
\label{fig:SMJ_lel}
\end{table}
	
\bigskip
\begin{table}[H]
\centering
\begin{tabular}{|>{\columncolor[gray]{0.9}} l | l |}
	\hline
	\textit{\textbf{Sin\'onimo}} & CA\\
	\hline
	\textit{\textbf{Noci\'on}}   & Genera mapa de entorno\\
	\hline
	\textit{\textbf{Impacto}}  	& Recibe informaci\'on de SMR\\
				 				& Env\'ia mapa a viewManager\\
	\hline
\end{tabular}
\caption{CA}
\label{fig:AC_lel}
\end{table}
	
\bigskip
\begin{table}[H]
\centering
\begin{tabular}{|>{\columncolor[gray]{0.9}} l | l |}
	\hline
	\textit{\textbf{Sin\'onimo}} & viewManager\\
	\hline
	\textit{\textbf{Noci\'on}}   & Muestra mapa en pantalla\\
	\hline
	\textit{\textbf{Impacto}}  	& viewManager recibe informaci\'on de CA\\
	\hline
\end{tabular}
\caption{View Manager}
\label{fig:VM_lel}
\end{table}



\subsection{Diagrama de clases}

El diagrama de clases de la figura ~\ref{fig:conexion} nos da una aproximaci\'on de como se va a implementar el sistema. En este diagrama de secuencia podemos ver las clases candidatas que se obtuvieron a partir del LEL.
\begin{itemize}
	\item con2Ini
	\item SMR
	\item SMJ
	\item CA
	\item ViewManager
\end{itemize}

\begin{figure}[H]
		\centering
		\includegraphics[scale=0.5]{capitulo02/clases}
		\caption{Diagrama de clases}
		\label{fig:class}
\end{figure}

Lo siguiente nos muestra el diagrama de clases con la implementacion de la interfaz de usuario. Este es el diagrama de clases final.

\includepdf[pages={-}]{capitulo02/final.pdf}


\subsection{Diagramas de secuencia}
El diagrama de secuencias nos va a dar una idea de como viajan los mensajes atrav\'es del sistema y como se transmiten y reciben por parte del usuario y el robot. A continuaci\'on podemos ver las distintas situaciones que se pueden presentar una vez que el sistema est\'a funcionando.

\begin{figure}[H]
		\centering
		\includegraphics[scale=0.5]{capitulo02/secuenciainicio}
		\caption{Secuencia de conexi\'on}
		\label{fig:conexion}
\end{figure}

\begin{figure}[H]
		\centering
		\includegraphics[scale=0.5]{capitulo02/move}
		\caption{Secuencia de movimiento}
		\label{fig:move}
\end{figure}

\begin{figure}[H]
		\centering
		\includegraphics[scale=0.6]{capitulo02/rotar}
		\caption{Secuencia de rotaci\'on}
		\label{fig:rotate}
\end{figure}


\begin{figure}[H]
		\centering
		\includegraphics[scale=0.6]{capitulo02/failed}
		\caption{Fallo de inicio}
		\label{fig:failed}
\end{figure}
